home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / MathLink / MLExample_3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-19  |  3.4 KB  |  182 lines

  1. #import <stdio.h>
  2. #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
  3.  
  4. #define DEBUG FALSE
  5.  
  6. void  error(MLINK);
  7. void  read_and_print_expression(MLINK);
  8. int   ReadPacket(MLINK);
  9.  
  10. void example_3(char *);
  11.  
  12. MLINK link;
  13.  
  14. main()
  15. {
  16.     char result[10000];
  17.     
  18.     link = MLStart("math -mathlink -batchoutput -noinit");
  19.  
  20.     strcpy(result,"Expand[(1+x)^5]");
  21.     example_3(result);
  22.     printf("%s\n",result);       
  23.  
  24.     MLClose(link);
  25. }
  26.  
  27. void example_3(array)
  28. char *array;
  29. {    
  30.     char *rtn;
  31.     
  32.     MLPutFunction(link,"ToString",1);
  33.       MLPutFunction(link,"InputForm",1);
  34.         MLPutFunction(link,"ToExpression",1);
  35.           MLPutString(link,array);
  36.     MLEndPacket(link);
  37.  
  38.     if (DEBUG)
  39.     {
  40.       read_and_print_expression(link);
  41.       return;
  42.     }    
  43.  
  44.     while (MLNextPacket(link) != RETURNPKT)
  45.     {
  46.        MLNewPacket(link);
  47.        if (!MLCheck(link))
  48.           error(link);
  49.     }
  50.     
  51.     MLGetNext(link);
  52.     MLGetString(link,&rtn);
  53.     strcpy(array,rtn);
  54. }  
  55.  
  56. void  error( mlp) MLINK mlp;
  57. {
  58.     fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
  59.     MLClose( mlp);
  60.     exit( 0);
  61. }  /* error */
  62.  
  63. void  read_and_print_expression( p) MLINK p;
  64. {
  65.     char  *s;
  66.     int    n, i, len;
  67.     double r;
  68.     static int indent;
  69.     
  70.     i=MLGetNext(p);
  71.     fprintf(stderr, "Packet type = %d\n",i);
  72.     
  73.     switch (i) {    
  74.     case MLTKSYM:
  75.         MLGetSymbol( p, &s);
  76.         fprintf( stderr, "%s ", s);
  77.         break;
  78.     case MLTKSTR:
  79.         MLGetString( p, &s);
  80.         fprintf( stderr, "\"%s\" ", s);
  81.         break;
  82.     case MLTKINT:
  83.         MLGetInteger( p, &n);
  84.         fprintf( stderr, "%d ", n);
  85.         break;
  86.     case MLTKREAL:
  87.         MLGetReal( p, &r);
  88.         fprintf( stderr, "%f ", r);
  89.         break;
  90.     case MLTKFUNC:
  91.         indent += 3;
  92.         fprintf( stderr, "\n %*.*s", indent, indent, "");
  93.         if (MLGetArgCount( p, &len) == 0) {
  94.             error( p);
  95.         }else{
  96.             read_and_print_expression(p);
  97.             fprintf( stderr, "[");
  98.             for (i = 1; i <= len; ++i) {
  99.                 read_and_print_expression(p);
  100.                 if (i != len) fprintf( stderr, ", ");
  101.             }
  102.             fprintf( stderr, "]");
  103.         }
  104.         indent -= 3;
  105.         break;
  106.     case MLTKERROR:
  107.     default:
  108.         error( p);
  109.     }
  110. }  /* read_and_print_expression */
  111.  
  112.  
  113. int   ReadPacket( mlp)  MLINK mlp;
  114. {    int code;
  115.     int len = 1;
  116.  
  117.     switch (code = MLNextPacket(mlp)) {
  118.     case INPUTPKT:
  119.         fprintf( stderr, "<INPUTPKT>");
  120.         break;
  121.     case OUTPUTPKT:
  122.         fprintf( stderr, "<OUTPUTPKT>");
  123.         break;
  124.     case TEXTPKT:
  125.         if (DEBUG) fprintf( stderr, "<TEXTPKT>");
  126.         break;
  127.     case RETURNPKT:
  128.         fprintf( stderr, "Result (expression):");
  129.         break;
  130.     case RETURNTEXTPKT:
  131.         fprintf( stderr, "=");
  132.         break;
  133.     case MESSAGEPKT:
  134.         len = 2;
  135.         fprintf( stderr, "\nMessage packet:");
  136.         break;
  137.     case CALLPKT:
  138.         fprintf( stderr, "<CALLPKT>");
  139.         break;
  140.     case INPUTNAMEPKT:
  141.         fprintf( stderr, "\n");
  142.         break;
  143.     case OUTPUTNAMEPKT:
  144.         if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
  145.         break;   
  146.     case CONTROLPKT:
  147.         fprintf( stderr, "<CONTROLPKT>");
  148.         break;   
  149.     case SYNTAXPKT:
  150.         fprintf( stderr, "<SYNTAXERROR>");
  151.         break;   
  152.     default:
  153.         fprintf( stderr, "unknown packet \"%d\"\n", code);
  154.         return 0;
  155.     }
  156.     while (len --) {
  157.         read_and_print_expression( mlp);
  158.     }
  159.     if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
  160.         fprintf( stderr, "\n");
  161.     }
  162.     return code;
  163. }  /* ReadPacket */
  164.  
  165. /*******************************************/
  166. /* Search for string t in string s         */
  167. /* Return position if found, otherwise -1  */
  168. /*******************************************/
  169. int instr(s,t)
  170. char *s,*t;
  171. {
  172.      int i,j,k;
  173.      
  174.      for (i=0 ; s[i] && t[0] ; i++)
  175.      {
  176.          for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
  177.         if (!t[k]) 
  178.            return(i);
  179.      }
  180.      return(-1);
  181. }
  182.